package top.byfree.jbyan.find;

import top.byfree.jbyan.find.command.CommandLineArgs;
import top.byfree.jbyan.find.exception.ParseArgException;
import top.byfree.jbyan.find.handler.impl.ConsoleResultHandler;
import top.byfree.jbyan.find.handler.impl.FileResultHandler;
import top.byfree.jbyan.find.handler.impl.MoreKeyFinder;

import static top.byfree.jbyan.find.command.Arg.HELP;
import static top.byfree.jbyan.find.command.Arg.OUT;

/**
 * @author jbyan
 * @since 2023/8/4
 */
public class FindApplication {

    public static final CommandLineArgs ARGS = new CommandLineArgs();

    public void run(String[] args) {
        try {
            // 解析命令行参数
            ARGS.parse(args);

            // 存在参数 --help
            boolean help = ARGS.isArg(HELP);
            if (help) {
                printHelp();
                return;
            }

            // 不存在使用查询一个key的处理类
            MoreKeyFinder moreKeyFinder = new MoreKeyFinder();
            // 遍历目录
            DirectoryProcessor directoryProcessor = new DirectoryProcessor(moreKeyFinder);
            // 添加一个控制台输出处理类
            directoryProcessor.addResultHandler(new ConsoleResultHandler());
            if (ARGS.isArg(OUT)) {
                // 存在out参数，添加一个文件处理类
                directoryProcessor.addResultHandler(new FileResultHandler());
            }
            directoryProcessor.processor();

        } catch (ParseArgException e) {
            System.out.println(e.getMessage());
        }
    }

    private void printHelp() {
        String s = "参数\t别名\t描述\n" +
                "--range [size]\t-\t检索两个关键字时，允许两关键字间隔的最大行数，默认200\n" +
                "--encoding [coding]\t-e\t指定编码，默认UTF-8\n" +
                "--out [目录]\t-o\t指定输出结果的目录，默认不输出，不指定目录默认为当前目录\n" +
                "--result_message\t-r\t是否在控制台打印检索到的行\n" +
                "--directory <目录>\t-d\t指定检索的目录，默认当前目录\n" +
                "--depth [size]\t-\t指定检索目录时，递归遍历目录的最大深度，默认Integer.MAX_VALUE\n" +
                "--thread_pool [size]\t-\t指定遍历时启用的线程数量，默认6\n" +
                "--binary\t-b\t是否检索二进制文件，默认不检索\n" +
                "--result_all\t-a\t是否显示未命中的文件结果";

        System.out.println(s);
    }


}
